glitter makes SPARQLglitter, un package R pour explorer et collecter des données du web sémantiqueLise Vaudor
21/10/2021
Analyste de données dans un labo de géographie (UMR 5600 Environnement Ville Société)
Rôle pédagogique: aider les collègues à utiliser R pour leurs analyses/valorisation (blog🔗)
Travail d’appui à la recherche => développement d’outils d’analyse, recueil de données du web (API, web-scraping…)
Projet émergent ENS RECIT
=> R pour l’Exploration et la Collecte Intégrée de Triplets de données
Recrutement de Camille Scheffler (stage M2) et exploration des Wikidata pour deux cas d’études:
En lien (et en parallèle) aux cas d’études de Camille, développement du package R glitter.
🎯 Objectifs:
Promouvoir l’usage (exploration, recueil, analyse) des LOD pour les chercheurs et étudiants usagers de R, en:
© Camille Scheffler
© Camille Scheffler
|
|
Importance des exemples de requêtes SPARQL pour explorer les bases de données Or, le langage SPARQL est spécifique à
|
|
Un petit projet … (projet émergent ENS, 20 000 euros sur 3 ans). 🐈
|
|
SELECT ?film ?filmLabel
WHERE {
?film wdt:P31 wd:Q11424.
SERVICE wikibase:label {
bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
}
}
LIMIT 10
query='SELECT ?film ?filmLabel
WHERE {
?film wdt:P31 wd:Q11424.
SERVICE wikibase:label {
bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
}
}'
result=purrr::quietly(WikidataQueryServiceR::query_wikidata)(query)
tib=result$r🎯 Chaîne de traitement reproductible
| film | filmLabel |
|---|---|
| http://www.wikidata.org/entity/Q372 | We Live in Public |
| http://www.wikidata.org/entity/Q593 | A Gang Story |
| http://www.wikidata.org/entity/Q595 | The Intouchables |
| http://www.wikidata.org/entity/Q1365 | Swept Away |
| http://www.wikidata.org/entity/Q2201 | Kick-Ass |
| http://www.wikidata.org/entity/Q2345 | 12 Angry Men |
Avant:
query='SELECT ?film ?filmLabel WHERE {
?film wdt:P31 wd:Q11424.
SERVICE wikibase:label {
bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en".
}
}
LIMIT 10'
result=WikidataQueryServiceR::query_wikidata(query)
tib=result$rAprès:
tib=spq_init() %>% # Initialise requête puis
spq_add("?film wdt:P31 wd:Q11424", label="?film") %>% # Ajoute triplet "?film est une instance de film" puis
spq_add("?film wdt:P840 ?loc", label="?loc") %>% # Ajoute triplet "?film a pour localisation narrative ?loc (à étiqueter) puis
spq_language("en,fr") %>% # Affiche les étiquettes en anglais, ou à défaut en français puis
spq_head(n=10) %>% # Sélectionne les 10 premiers résultats puis
send() # Envoie la requête
knitr::kable(tib)Combien de films ont la localisation narrative renseignée dans Wikidata?
tib=spq_init() %>% # Initialise requête puis
spq_add("?film wdt:P31 wd:Q11424", label="?film") %>% # Ajoute triplet "?film est une instance de film" puis
spq_add("?film wdt:P840 ?loc", label="?loc") %>% # Ajoute triplet "?film a pour localisation narrative ?loc (à étiqueter) puis
spq_summarise(c("?n_films"="COUNT(?film)")) %>% # Résume en comptant le nombre de films puis
send() # Envoie la requête
knitr::kable(tib) # Montre la table| n_films |
|---|
| 46877 |
lf_1=spq_init() %>% # Initialise requête puis
spq_add("?film wdt:P31 wd:Q11424", label="?film") %>% # Ajoute triplet "?film est une instance de film" puis
spq_add("?film wdt:P840 ?loc", label="?loc") %>% # Ajoute triplet "?film a pour localisation narrative ?loc (à étiqueter) puis
spq_add("?loc wdt:P625 ?coords", # Ajoute triplet "?loc a pour coordonnées spatiales ?coords"
within_box=list(southwest=c(3,43), # ... restreins pour que les coordonnées soient comprises
northeast=c(7,47))) %>% # ... dans un cadre défini par ces deux points (S-O et N-E) puis
spq_language("fr") %>% # Etiquette de préférence en français puis
send() # Envoie la requêteCette table comprend 317 lignes. Voici les premières:
| film | filmLabel | loc | locLabel | coords |
|---|---|---|---|---|
| http://www.wikidata.org/entity/Q86427 | À bout de souffle | http://www.wikidata.org/entity/Q23482 | Marseille | Point(5.376388888 43.296666666) |
| http://www.wikidata.org/entity/Q105624 | La Mémoire dans la peau | http://www.wikidata.org/entity/Q23482 | Marseille | Point(5.376388888 43.296666666) |
| http://www.wikidata.org/entity/Q151711 | Marie-Jo et ses deux amours | http://www.wikidata.org/entity/Q23482 | Marseille | Point(5.376388888 43.296666666) |
| http://www.wikidata.org/entity/Q190588 | Love Actually | http://www.wikidata.org/entity/Q23482 | Marseille | Point(5.376388888 43.296666666) |
| http://www.wikidata.org/entity/Q208108 | Arrête-moi si tu peux | http://www.wikidata.org/entity/Q23482 | Marseille | Point(5.376388888 43.296666666) |
| http://www.wikidata.org/entity/Q215319 | L’Immortel | http://www.wikidata.org/entity/Q23482 | Marseille | Point(5.376388888 43.296666666) |
lf_2=spq_init() %>% # Initialise requête puis
spq_add("?film wdt:P31 wd:Q11424", label="?film") %>% # Ajoute triplet "?film est une instance de film" puis
spq_add("?film wdt:P840 ?loc", label="?loc") %>% # Ajoute triplet "?film a pour localisation narrative ?loc (à étiqueter) puis
spq_add("?loc wdt:P625 ?coords", # Ajoute triplet "?loc a pour coordonnées spatiales ?coords"
within_box=list(southwest=c(3,43), # ... restreins pour que les coordonnées soient comprises
northeast=c(7,47)))%>% # ... dans un cadre défini par ces deux points (S-O et N-E) puis
spq_add("?film wdt:P18 ?image", required=FALSE) %>% # Ajoute triplet "?film a pour image d'illustration ?image" puis
spq_add("?film wdt:P921 ?subject", # Ajoute triplet "?film a pour sujet ?subject" (info optionnelle)
label="?subject", required=FALSE) %>% # ... étiquette ?subject puis
spq_add("?film wdt:P577 ?date") %>% # Ajoute triplet "?film a été publié à la date ?date puis
spq_mutate(c("?year"="year(?date)")) %>% # Ajoute une variable ?year qui corresond à l'année de ?date puis
spq_select("-?date") %>% # Enlève la variable ?date puis
spq_language("fr,en") %>% # Etiquette (de préférence en français, à défaut en anglais) puis
send() # Envoie la requêteCette table comprend 594 lignes. Voici les premières:
| film | filmLabel | loc | locLabel | coords | image | subject | subjectLabel | year |
|---|---|---|---|---|---|---|---|---|
| http://www.wikidata.org/entity/Q3226058 | Le Président | http://www.wikidata.org/entity/Q17005 | Languedoc-Roussillon | Point(3.166666666 43.666666666) | NA | NA | NA | 2010 |
| http://www.wikidata.org/entity/Q998396 | L’Emmerdeur | http://www.wikidata.org/entity/Q6441 | Montpellier | Point(3.877230555 43.610919444) | NA | NA | NA | 1973 |
| http://www.wikidata.org/entity/Q3226058 | Le Président | http://www.wikidata.org/entity/Q6441 | Montpellier | Point(3.877230555 43.610919444) | NA | NA | NA | 2010 |
| http://www.wikidata.org/entity/Q98730605 | Antoinette dans les Cévennes | http://www.wikidata.org/entity/Q626655 | Cévennes | Point(3.73926389 44.42623611) | NA | NA | NA | 2020 |
| http://www.wikidata.org/entity/Q98730605 | Antoinette dans les Cévennes | http://www.wikidata.org/entity/Q626655 | Cévennes | Point(3.73926389 44.42623611) | NA | NA | NA | 2020 |
| http://www.wikidata.org/entity/Q65924999 | Seules les bêtes | http://www.wikidata.org/entity/Q12580 | Lozère | Point(3.6 44.333333333) | NA | http://www.wikidata.org/entity/Q176640 | aléatoirité | 2019 |
##
## SELECT ?film ?filmLabel ?loc ?locLabel ?coords ?image ?subject ?subjectLabel (year(?date) AS ?year)
## WHERE{
##
## ?film wdt:P31 wd:Q11424.
## ?film wdt:P840 ?loc.
## SERVICE wikibase:box {
## ?loc wdt:P625 ?coords.
## bd:serviceParam wikibase:cornerSouthWest 'Point(3 43)'^^geo:wktLiteral.
## bd:serviceParam wikibase:cornerNorthEast 'Point(7 47)'^^geo:wktLiteral.
## }
## OPTIONAL {?film wdt:P18 ?image.}
## OPTIONAL {?film wdt:P921 ?subject.}
## ?film wdt:P577 ?date.
##
## SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en".}
## }
lf_c=lf_2 %>% # Considère lf_2 puis
select(film,ends_with("Label"),coords,image,year) %>% # Sélectionne ces variables (dont "....Label") puis
group_by(film,coords,image,locLabel,filmLabel) %>% # Groupe par ces variables puis
summarise(subjectLabel=stringr::str_c(unique(subjectLabel), # Résume par groupe: le sujet (sur une seule ligne)
collapse=", "), # ... en séparant les éléments par ", "
year=min(year), # ... et l'année comme minimum des années de sortie
.groups="drop") # DégroupeCette table comprend 315 lignes. Voici les premières:
| film | coords | image | locLabel | filmLabel | subjectLabel | year |
|---|---|---|---|---|---|---|
| http://www.wikidata.org/entity/Q100276888 | Point(6.5 44.8) | NA | Alpes françaises | Slalom | sport de compétition, sports industry | 2020 |
| http://www.wikidata.org/entity/Q1033136 | Point(5.376388888 43.296666666) | http://commons.wikimedia.org/wiki/Special:FilePath/Elka%C3%AFm%20Donzelli%20Cabourg%202011.jpg | Marseille | La guerre est déclarée | cancer | 2011 |
| http://www.wikidata.org/entity/Q105624 | Point(3.156666666 46.9925) | NA | Nevers | La Mémoire dans la peau | amnésie | 2002 |
| http://www.wikidata.org/entity/Q105624 | Point(5.376388888 43.296666666) | NA | Marseille | La Mémoire dans la peau | amnésie | 2002 |
| http://www.wikidata.org/entity/Q1061541 | Point(5.376388888 43.296666666) | NA | Marseille | Un prophète | crime organisé | 2009 |
| http://www.wikidata.org/entity/Q1062358 | Point(3.086944444 45.779722222) | NA | Clermont-Ferrand | Quand j’étais chanteur | vieillissement, industrie du spectacle, relation amoureuse, âge moyen, falling in love, human bonding, chansonnier, end of career | 2006 |
Préparation d’une fenêtre “pop-up” (langage html)
lf_m =lf_c %>%
transform_wikidata_coords("coords") %>%
mutate(popup=glue::glue("<h1>{filmLabel}<a href={film} target='_blank'>🔗</a></h1>
<li>Lieu: {locLabel}</li>
<li>Année de sortie: {year}</li>")) %>%
mutate(popup=case_when(is.na(image)~popup,
!is.na(image)~glue::glue("{popup}
<img src='{image}' height='200'>"))) %>%
mutate(popup=case_when(is.na(subjectLabel)~popup,
!is.na(subjectLabel)~glue::glue("{popup}
<li>Thèmes: {subjectLabel}</li>"))) Un package qui suit quelques principes du tidyverse…
spq_)|
Fonctions de base:
|
|
|
|
FILTRER les résultats renvoyés |
Articles avec “wikidata” dans le titre (en anglais):
spq_init() %>%
spq_add("?item wdt:P31 wd:Q13442814") %>% # ?item est une instance d'article scientifique
spq_add("?item rdfs:label ?itemTitle") %>% # ?item a pour titre ?itemTitle
spq_filter("contains(lcase(?itemTitle),'wikidata')") %>% # <= ce titre contient (en minuscules) "wikidata"
spq_filter("lang(?itemTitle)='en'") %>% # <= on filtre pour ne garder que les titres en anglais
spq_head(n=5) %>%
send() %>%
knitr::kable()| item | itemTitle |
|---|---|
| http://www.wikidata.org/entity/Q18507561 | Wikidata: A Free Collaborative Knowledgebase |
| http://www.wikidata.org/entity/Q21503276 | Utilizing the Wikidata system to improve the quality of medical content in Wikipedia in diverse languages: a pilot study |
| http://www.wikidata.org/entity/Q21503284 | Wikidata: A platform for data integration and dissemination for the life sciences and beyond |
| http://www.wikidata.org/entity/Q23712646 | Wikidata as a semantic framework for the Gene Wiki initiative |
| http://www.wikidata.org/entity/Q24074986 | From Freebase to Wikidata: The Great Migration |
|
|
MODIFIER les résultats renvoyés. |
Données sur films, date de sortie ET année de sortie
spq_init() %>%
spq_add("?film wdt:P31 wd:Q11424", label="?film") %>% # ?film est un instance de film
spq_add("?film wdt:P577 ?date") %>% # ?film est sorti à la date ?date
spq_mutate(c("?year"="year(?date)")) %>% # <= ajoute variable ?year correspondant à l'année de la date
spq_head(5) %>%
send() %>%
knitr::kable()| film | filmLabel | date | year |
|---|---|---|---|
| http://www.wikidata.org/entity/Q46609 | Una spina nel cuore | 1986-01-01 | 1986 |
| http://www.wikidata.org/entity/Q46637 | Maximum Overdrive | 1986-07-25 | 1986 |
| http://www.wikidata.org/entity/Q46637 | Maximum Overdrive | 1986-11-20 | 1986 |
| http://www.wikidata.org/entity/Q46717 | Pirates of the Caribbean: The Curse of the Black Pearl | 2003-07-09 | 2003 |
| http://www.wikidata.org/entity/Q46717 | Pirates of the Caribbean: The Curse of the Black Pearl | 2003-08-13 | 2003 |
|
|
SELECTIONNER les variables renvoyées |
Données sur films, localisation narrative, date de sortie ET année de sortie
spq_init() %>%
spq_add("?film wdt:P31 wd:Q11424", label="?film") %>% # ?film est une instance de film
spq_add("?film wdt:P577 ?date") %>% # ?film est sorti à la date ?date
spq_mutate(c("?year"="year(?date)")) %>% # ?year est l'année correspondant à ?date
spq_select("-?date") %>% # <= on retire la variable ?date
spq_head(5) %>%
send() %>%
knitr::kable()| film | filmLabel | year |
|---|---|---|
| http://www.wikidata.org/entity/Q46609 | Una spina nel cuore | 1986 |
| http://www.wikidata.org/entity/Q46637 | Maximum Overdrive | 1986 |
| http://www.wikidata.org/entity/Q46637 | Maximum Overdrive | 1986 |
| http://www.wikidata.org/entity/Q46717 | Pirates of the Caribbean: The Curse of the Black Pearl | 2003 |
| http://www.wikidata.org/entity/Q46717 | Pirates of the Caribbean: The Curse of the Black Pearl | 2003 |
|
|
ORDONNER les résultats renvoyés. |
Personnes nées ou habitant à New York qui font l’objet du plus grand nombre d’articles Wikimedia.
spq_init() %>%
spq_add("?pers wdt:P31 wd:Q5",label="?pers") %>% # ?pers est une instance de personne
spq_add("?pers wdt:P19/wdt:P131* wd:Q60") %>% # qui est née ou est située à New-York
spq_add("?pers wikibase:sitelinks ?sitelinks") %>% # ?personne fait l'objet de n liens dans le projet Wikimedia
spq_arrange(c("desc(?sitelinks)")) %>% # <= classe par ordre décroissant de n
spq_head(n=5) %>%
send() %>%
knitr::kable()| pers | persLabel | sitelinks |
|---|---|---|
| http://www.wikidata.org/entity/Q22686 | Donald Trump | 279 |
| http://www.wikidata.org/entity/Q4617 | Corbin Bleu | 219 |
| http://www.wikidata.org/entity/Q19848 | Lady Gaga | 178 |
| http://www.wikidata.org/entity/Q33866 | Theodore Roosevelt | 172 |
| http://www.wikidata.org/entity/Q25089 | Woody Allen | 150 |
|
|
GROUPER et RESUMER les résultats renvoyés. |
Communes d’Auvergne-Rhône-Alpes qui ont été supprimées lors de la réforme territoriale (nombre par département).
tib=spq_init() %>%
spq_add("?com wdt:P31 wd:Q21869758") %>% # ?com est une instance de commune disparue
spq_add("?com wdt:P131* wd:Q18338206") %>% # ?com est située dans un
spq_add("?com wdt:P131* ?dep", label="?dep") %>%
spq_add("?dep wdt:P31 wd:Q6465") %>%
spq_group_by(c("?dep", "?depLabel")) %>%
spq_summarise(c("?ncomsup"="count(?com)")) %>%
send() Certains éléments de syntaxe restent à simplifier…
|
Pour l’instant, beaucoup de longs “strings” inspirés de SPARQL |
Dans l’idéal, une syntaxe qui se rapprocherait le plus possible de: |
tib=spq_init()%>%
spq_add("?person rdfs:label 'David Bowie'@en") %>%
spq_add("?person dbo:birthPlace ?place") %>%
send("dbpedia")| person | place |
|---|---|
| http://dbpedia.org/resource/David_Bowie | http://dbpedia.org/resource/London |
tib=spq_init() %>%
spq_add("?person dbo:birthPlace ?place") %>%
spq_add("?person dbo:profession ?job") %>%
spq_add("?job rdfs:label ?jobLabel") %>%
spq_filter(c("LANG(?jobLabel)='en'")) %>%
spq_add("?place rdfs:label 'Lyon'@en") %>%
spq_head(10) %>%
send("dbpedia")query_doc=spq_init() %>%
spq_add("haldoc:inria-00362381 dcterms:hasVersion ?version") %>% # Ce doc a des versions ?version
spq_add("?version dcterms:title ?title") %>% # ?version a pour titre ?titre
spq_add(". dcterms:creator ?creator") %>% # ...... et pour créateur ?creator
spq_add(". ore:aggregates ?pdf") %>% # ...... et ce lien vers un ?pdf
spq_add("?creator hal:person ?person") %>% # ?creator est une personne ?person
spq_add("?person foaf:name ?name") # ?person a pour nom ?name
tib_doc=send(query_doc,"hal")
tib_doc## version
## 1 <https://data.archives-ouvertes.fr/document/inria-00362381v1>
## 2 <https://data.archives-ouvertes.fr/document/inria-00362381v1>
## 3 <https://data.archives-ouvertes.fr/document/inria-00362381v1>
## 4 <https://data.archives-ouvertes.fr/document/inria-00362381v1>
## 5 <https://data.archives-ouvertes.fr/document/inria-00362381v1>
## title
## 1 "Querying the Semantic Web of Data using SPARQL, RDF and XML"@en
## 2 "Querying the Semantic Web of Data using SPARQL, RDF and XML"@en
## 3 "Querying the Semantic Web of Data using SPARQL, RDF and XML"@en
## 4 "Querying the Semantic Web of Data using SPARQL, RDF and XML"@en
## 5 "Querying the Semantic Web of Data using SPARQL, RDF and XML"@en
## creator
## 1 _:genidnodeID://b614668616
## 2 _:genidnodeID://b614668617
## 3 _:genidnodeID://b614668614
## 4 _:genidnodeID://b614668618
## 5 _:genidnodeID://b614668615
## pdf
## 1 <https://hal.inria.fr/inria-00362381/file/RR-6847.pdf>
## 2 <https://hal.inria.fr/inria-00362381/file/RR-6847.pdf>
## 3 <https://hal.inria.fr/inria-00362381/file/RR-6847.pdf>
## 4 <https://hal.inria.fr/inria-00362381/file/RR-6847.pdf>
## 5 <https://hal.inria.fr/inria-00362381/file/RR-6847.pdf>
## person name
## 1 <https://data.archives-ouvertes.fr/author/62909> Hacène Cherfi
## 2 <https://data.archives-ouvertes.fr/author/827904> Fabien Gandon
## 3 <https://data.archives-ouvertes.fr/author/720457> Olivier Corby
## 4 <https://data.archives-ouvertes.fr/author/159177> Khaled Mohamed Khelif
## 5 <https://data.archives-ouvertes.fr/author/327261> Leila Kefi-Khelif
Données SIPROJURIS: Le parcours biographique de Gaston,Louis, Henry May (1849 - 1940)
tib=spq_init() %>%
spq_add("?tyro rdfs:label ?TyRoLabel") %>%
spq_add("?tyin rdfs:label ?TyInLabel") %>%
spq_add("?s ?p syr:Actr56241") %>%
spq_add(". sym:isComponentOf ?info") %>%
spq_add(". sym:hasRoleType ?tyro") %>%
spq_add("?info sym:knowledgeUnitStandardLabel ?infoStandardLabel") %>%
spq_add(". sym:knowledgeUnitStandardDate ?infoStandardDate") %>%
spq_add(". sym:hasKnowledgeUnitType ?tyin") %>%
spq_arrange("?infoStandardDate") %>%
spq_head(n=10) %>%
send(e="SyMoGIH")
knitr::kable(tib)query_doc=spq_init() %>%
spq_add("haldoc:inria-00362381 dcterms:hasVersion ?version") %>% # Ce doc a des versions ?version
spq_add("?version dcterms:title ?title") %>% # ?version a pour titre ?titre
spq_add(". dcterms:creator ?creator") %>% # ...... et pour créateur ?creator
spq_add(". ore:aggregates ?pdf") %>% # ...... et ce lien vers un ?pdf
spq_add("?creator hal:person ?person") %>% # ?creator est une personne ?person
spq_add("?person foaf:name ?name") ## PREFIX foaf: <http://xmlns.com/foaf/0.1/>
## PREFIX dcterms: <http://purl.org/dc/terms/>
## PREFIX ore: <http://www.openarchives.org/ore/terms/>
## PREFIX hal: <http://data.archives-ouvertes.fr/schema/>
## PREFIX haldoc: <https://data.archives-ouvertes.fr/document/>
## SELECT ?version ?title ?creator ?pdf ?person ?name
## WHERE{
##
## haldoc:inria-00362381 dcterms:hasVersion ?version.
## ?version dcterms:title ?title.
## ?version dcterms:creator ?creator.
## ?version ore:aggregates ?pdf.
## ?creator hal:person ?person.
## ?person foaf:name ?name.
##
## SERVICE wikibase:label { bd:serviceParam wikibase:language "en".}
## }
## # A tibble: 26 × 3
## type name url
## <chr> <chr> <chr>
## 1 Wikidata wd http://www.wikidata.org/entity/
## 2 Wikidata wdt http://www.wikidata.org/prop/direct/
## 3 Wikidata ps http://www.wikidata.org/prop/statement/
## 4 Wikidata pq http://www.wikidata.org/prop/qualifier/
## 5 Wikidata wikibase http://wikiba.se/ontology#
## 6 dbpedia dbo http://dbpedia.org/ontology/
## 7 generic foaf http://xmlns.com/foaf/0.1/
## 8 generic rdfs http://www.w3.org/2000/01/rdf-schema#
## 9 generic bio http://vocab.org/bio/0.1/
## 10 generic dcterms http://purl.org/dc/terms/
## # … with 16 more rows
## # A tibble: 6 × 2
## name url
## <chr> <chr>
## 1 wikidata https://query.wikidata.org/
## 2 dbpedia https://dbpedia.org/sparql
## 3 databnf https://data.bnf.fr/sparql
## 4 isidore https://isidore.science/sparql
## 5 hal http://sparql.archives-ouvertes.fr/sparql
## 6 symogih http://bhp-publi.ish-lyon.cnrs.fr:8888/sparql
people=spq_init() %>%
spq_add("?louis16 is wd:Q7732") %>%
spq_add("?louis16 (wdt:P22*/wdt:P25*) ?who", label="?who") %>%
spq_select("-?louis16") %>%
spq_language("fr") %>%
send()%>%
mutate(num=1:n())list_people=people %>%
clean_wikidata_table() %>%
pull(who)
links=spq_init() %>%
spq_add("?person %in% {list_people}") %>%
spq_add("?person wdt:P22 ?p_father") %>%
spq_add("?person wdt:P25 ?p_mother", label="?p_mother") %>%
spq_language("fr") %>%
send()
list_people=bind_rows(people,
links %>%
select(who=p_mother,whoLabel=p_motherLabel))
links=links %>%
select(person,p_father,p_mother) %>%
tidyr::pivot_longer(cols=starts_with("p_"),
names_to="which_parent",
values_to="parent")
linknew=links %>%
left_join(people %>%
select(who,num_person=num),
by=c("person"="who")) %>%
left_join(people %>%
select(who,num_parent=num),
by=c("parent"="who"))Recrutement de Camille Scheffler (stage M2) et exploration des Wikidata pour deux cas d’études: